// 资源引入
import router from './router';
import store from './store';
import { Message } from 'element-ui';
import NProgress from 'nprogress';// 页面加载进度条
import 'nprogress/nprogress.css';// 进度条的样式
import { getToken } from '@/utils/auth';
import getPageTitle from '@/utils/get-page-title';

// 配置进度条
NProgress.configure({showSpinner: false});

// 不进行重定向白名单列表
const whiteList = ['/login','/404','*'];
const verifyCodeList = [0,1,2,3];

// 全局前置导航守卫
router.beforeEach(async(to, from, next) => {
    // 进度加载
    NProgress.start();
    // 页面标题 [xxx - 济公网]
    document.title = getPageTitle(to.meta.title)
    // 获取用户信息 [ store/modules/user - actions - setUserInfo 进行写入本地 ]
    let user = localStorage.getItem('user');
    // 已登录 - 每一的页面路由都要进行一次状态验证
    if(user) {
        const userInfo = JSON.parse(localStorage.getItem('user'));
        // 存储用户信息
        store.dispatch('user/setUserInfo', userInfo);
        // 登录页跳转
        if(to.path === '/login') {
            next({path: '/'});
            NProgress.done();
        // 其它页跳转
        } else {
            // 认证状态
            const vStatus = userInfo.verificationStatus;
            // 存在认证状态 0 || 1 || 2 || 3 [ 如果未认证，此属性为 undefined ]
            if(verifyCodeList.includes(vStatus)) {
                next();
            // 0 || undefined [ userInfo 从 localStorage 拿的 ]
            } else {
                // 如果请求失败了，进行捕获，不能让跳出去
                try {
                    //认证请求
                    const { verificationStatus } = await store.dispatch('user/queryEnterpriseCertificationStatus');
                    //认证状态合法 0 || ""
                    if(verificationStatus < 4) {
                        next();
                    //认证异常调到登录页 [ 添加了一个查询参数: redirect ]
                    }else{
                        next(`/login?redirect=${to.path}`);
                        NProgress.done();
                    }
                // 请求失败，清空 token
                } catch(error) {
                    await store.dispatch('user/resetToken');
                    Message.error('认证请求异常');
                    next(`/login?redirect=${to.path}`);
                    NProgress.done();
                }
            }
        }
    // 未登录
    } else {
        // 未登录 & 路由白名单
        if(whiteList.indexOf(to.path) !== -1) {
            next();
        // 未登录 & 非路由白名单
        } else {
            next(`/login?redirect=${to.path}`);
            NProgress.done();
        }
    }
})

// 全局后置导航守卫
router.afterEach(() => {
    NProgress.done();
});